package com.gitee.qdbp.general.common.api.settings.service;

import java.util.List;
import java.util.Map;
import com.gitee.qdbp.able.beans.KeyString;
import com.gitee.qdbp.able.exception.ServiceException;
import com.gitee.qdbp.able.jdbc.ordering.OrderPaging;
import com.gitee.qdbp.able.jdbc.paging.PageList;
import com.gitee.qdbp.general.common.api.settings.model.SystemConfigCoreBean;
import com.gitee.qdbp.general.common.api.settings.model.SystemConfigCoreWhere;
import com.gitee.qdbp.general.common.enums.ConfigScene;

/**
 * 系统数据字典查询接口, 查询指定租户编号的配置项(DataType=ITEMS)<br>
 * system_config_core记录只在开发时维护<br>
 * 管理员只能修改configValue, 并保存在system_config_customize表<br>
 * 查询时以system_config_customize表的configValue优先<br>
 * scene分为: platform(平台), manager(管理员), user(用户)
 *
 * @author zhh
 * @version 170802
 */
public interface ISystemDataDictQueryer {

    /** 查询枚举类型的选项列表(如果valueType不是enums则返回null) **/
    List<KeyString> findEnumValues(ConfigScene scene, String tenantCode, String configKey) throws ServiceException;

    /** 查询枚举类型的选项列表List&lt;KeyString&gt;中key=subkey的那一项(如果valueType不是enums则返回null) **/
    KeyString findEnumValue(ConfigScene scene, String tenantCode, String configKey, String subkey)
            throws ServiceException;

    /** 查询枚举类型的选项列表(如果valueType不是enums则返回null) **/
    Map<String, List<KeyString>> listEnumValues(ConfigScene scene, String tenantCode, List<String> configKeys)
            throws ServiceException;

    /**
     * 查询对象类型的选项列表(如果valueType不是object则返回null)<br>
     * 对clazz=KeyString作了特殊处理, 会将valueField设置为KeyString的key, textField设置为KeyString.value
     * 
     * @param scene 使用场景
     * @param tenantCode 租户编号
     * @param configKey 配置项KEY
     * @param clazz 返回类型
     * @return
     * @throws ServiceException
     */
    <T> List<T> findObjectValues(ConfigScene scene, String tenantCode, String configKey, Class<T> clazz)
            throws ServiceException;

    /**
     * 查询对象类型的选项列表的指定项(如果valueType不是object则返回null)<br>
     * 返回configValue解析为List&lt;T&gt;中valueField=subkey的那一项<br>
     * 对clazz=KeyString作了特殊处理, 会将valueField设置为KeyString的key, textField设置为KeyString.value
     * 
     * @param scene 使用场景
     * @param tenantCode 租户编号
     * @param configKey 配置项KEY
     * @param subkey 指定项的KEY
     * @param clazz 返回类型
     * @return
     * @throws ServiceException
     */
    <T> T findObjectValue(ConfigScene scene, String tenantCode, String configKey, String subkey, Class<T> clazz)
            throws ServiceException;

    /**
     * 查询对象类型的选项列表(如果valueType不是object则返回null)<br>
     * 对clazz=KeyString作了特殊处理, 会将valueField设置为KeyString的key, textField设置为KeyString.value
     * 
     * @param scene 使用场景
     * @param tenantCode 租户编号
     * @param configKeys 配置项KEY
     * @param clazz 返回类型
     * @return
     * @throws ServiceException
     */
    <T> Map<String, List<T>> listObjectValues(ConfigScene scene, String tenantCode, List<String> configKeys,
            Class<T> clazz) throws ServiceException;

    /** 根据KEY查询(不查禁用的) **/
    SystemConfigCoreBean findByKey(ConfigScene scene, String tenantCode, String configKey) throws ServiceException;

    /** 根据KEY查询VALUE(不查禁用的) **/
    String findConfigValueByKey(ConfigScene scene, String tenantCode, String configKey) throws ServiceException;

    /** 根据KEY查询VALUE(不查禁用的) **/
    default String findConfigValueByKey(ConfigScene scene, String tenantCode, String configKey, String defValue)
            throws ServiceException {
        String value = findConfigValueByKey(scene, tenantCode, configKey);
        return value != null ? value : defValue;
    }

    /** 根据KEY查询列表(不查禁用的) **/
    Map<String, SystemConfigCoreBean> listByKeys(ConfigScene scene, String tenantCode, List<String> configKeys);

    /** 根据条件查找 **/
    SystemConfigCoreBean find(ConfigScene scene, String tenantCode, SystemConfigCoreWhere where)
            throws ServiceException;

    /** 根据条件查询列表 **/
    PageList<SystemConfigCoreBean> list(ConfigScene scene, String tenantCode, SystemConfigCoreWhere where,
            OrderPaging paging);
}
